// 操作数据库模块
const mysql = require('mysql');
// 连接池
const pool = mysql.createPool({
    host     : 'localhost',
    user     : 'root',
    password : '123456',
    port     : '3306',
    database : 'community',
    // 允许一次性执行多条SQL语句
    multipleStatements: true
});
/**
 * 封装一个数据库模型基类
 * @type {module.mysql}
 */
module.exports = class Mysql{
    /**
     * 通用的查询方法
     * @param sql要执行的sql语句
     * params 跟占位符顺序匹配的参数数组，要求跟sql的占位符数量一样多
     */
    static query (sql,params){
        return new Promise((resolve, reject) => {
            pool.getConnection(function (err, connection) {
                if (err) {
                    console.error(err)
                    connection.release()
                    // reject(err)
                } else {
                    // query执行sql语句
                    connection.query(sql, params, (err, results) => {
                        if (err) {
                            console.error(err)
                            reject(err)
                        } else {
                            console.log(`result : ${JSON.stringify(results)}`);
                            resolve(results)
                            // console.log(data)
                        }
                        // 结束会话，释放连接
                        connection.release()
                    })
                }
            })
        }).then(data=>data)//(data)=>{return data}
            .catch(e=>{throw e})
    }
    static formarParams(){
        let array = []
        for(var i = 0, l = arguments.length; i < l; i++){
        array.push(arguments[i]);
    }
        return array
    }


    static  getNowAndLastDate(){
        let date= new Date();
        let Month =""
        let now=date.getDate()
        let lastnow=date.getDate()
        if ((date.getMonth()+1)<10)   Month="0"+String((date.getMonth()+1))
        else Month=(date.getMonth()+1)+""
        switch(date.getMonth()){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                if(lastnow<31)  lastnow++
                else {lastnow='01';Month++}
                break;
            case 2://如果是闰年且小于28
                if(!(now % (now % 100 ? 4 : 400))&& lastnow<28)   lastnow++;
                else if(lastnow<28) lastnow++
                else {lastnow='01';Month++}
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                if(lastnow<30)  lastnow++
                else {lastnow='01';Month++}
                break;
        }
        // let now=date.getDate()

        if(date.getDate()<10) now="0"+date.getDate()
        if(date.getDate()<9) lastnow="0"+(date.getDate())
        let newDate= ""+date.getFullYear()+Month+now
        let lastDate=""+date.getFullYear()+Month+lastnow
        let nowMonth=""+date.getFullYear()+Month+"01"
        let lastMonth=""+date.getFullYear()+Month+"31"

        return {newDate,lastDate,nowMonth,lastMonth}

    }
}

// select 返回一个数组里头包含了多个对象
// update delete insert返回一个对象，里头包含有affectRow（受影响行）等信息

// /**
//  * 增删改查 通用组件  同步写法
//  *
//  * @param sql 增删改查sql 含占位符
//  * @param params 跟占位符顺序匹配的参数数组，要求跟sql的占位符数量一样多
//  */
// let exec = function (sql,params) {
//     // 返回一个 Promise 如果异步转同步不进行.then和.catch，那么就会出现如下情况：
//     // 1 代码执行有返回值
//     // 2 代码执行不正常也有返回值
//     // 因此需要对错误做处理：直接将错误抛出去
//     return new Promise((resolve, reject) => {
//         pool.getConnection(function (err, connection) {
//             if (err) {
//                 reject(err)
//             } else {
//                 connection.query(sql, params, (err, results) => {
//
//                     if (err) {
//                         reject(err)
//                     } else {
//                         console.log(`result : ${JSON.stringify(results)}`);
//                         resolve(results)
//                         // console.log(data)
//                     }
//                     // 结束会话
//                     connection.release()
//                 })
//             }
//         })
//     }).then(data=>data)//(data)=>{return data}
//         .catch(e=>{throw e})
// }
// // let a = (data)=>{return data++}
// // // 第一层变化：当一个函数体的内部代码只有一行的时候，那么return可省
// // let a = (data) => {data++}
// // // 第二层变化：当一个函数的返回值只有一个的时候，大括号可省
// // let a = (data) => data++
// // // 第三层变化：当一个箭头函数的入参有且仅有一个的时候，参数的小括号可省
// // let a  = data => data++
// //
// // if (true) {
// //     console.log(1)
// // }
// // // 代码块只有一行的时候，大括号可省
// // if (true)
// //     console.log(1)// if条件满足才会执行
// //     console.log(2)// 不管if会不会满足都会执行
//
// /**
//  * 将所有的参数格式化成数组 参数是可变参数（可变参数在函数声明的时候不写）
//  * @returns {Array}
//  */
// let formatParams = function () {
//     var array = [];
//
//     //js中有个变量arguments,可以访问所有传入的值
//     for(var i = 0, l = arguments.length; i < l; i++){
//         array.push(arguments[i]);
//     }
//     return array;
// }
// module.exports = {exec, formatParams};


// ？称为占位符，表示这个位置要填充一个参数
// let mySql = 'insert into student (id, name,age,sex,info) values (?, ?,?,?,?)'
// // let mySql = 'select id, name from student where sex1 = ?'
// // 参数是一个数组，必须按照占位符对应的参数的顺序
// let myParams = ['11', '八九不离十',1,1,'111']
// let a = async () =>{
//     try {
//         let result = await exec(mySql, formatParams('11','name',1,1,'1111'))
//         console.log('执行成功了')
//     } catch (e) {
//         console.log('执行异常：')
//         console.log(e.userMessage)
//     }
// }
// a()

// let a = ()=>{
//     return new Promise((resolve, reject) => {
//         reject(new Error('异步里头的错误'))
//     }).catch(e=>{throw e})
// }
//
// let b = async ()=>{
//     try {
//         await a()
//     } catch (e) {
//         console.log('我在b方法里头拿到了错误：' + e.userMessage)
//     }
// }
//
// b()

